From: Florian Müllner Date: Fri, 8 Nov 2019 17:22:40 +0000 (+0100) Subject: windowManager: Complete interrupted size change effects X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~781^2^2~444 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=fc71f8b33a64854e2c0247a54e442f2c3ca0b487;p=gnome-shell.git windowManager: Complete interrupted size change effects Resizing effects are more finicky as other effects, as the actual animation is delayed until we receive the ::size-changed signal. However that signal may never be emitted if the window is destroyed just after starting the size-change effect, in which case the effect is never completed, blocking mutter from destroying the corresponding window actor. Address this by tracking when a resize effect is pending, and complete the effect when appropriate. https://gitlab.gnome.org/GNOME/mutter/issues/655 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/815 --- diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index 74d4faf7f..c19043fae 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -703,6 +703,7 @@ var WindowManager = class { this._unminimizing = new Set(); this._mapping = new Set(); this._resizing = new Set(); + this._resizePending = new Set(); this._destroying = new Set(); this._movingWindow = null; @@ -1464,6 +1465,7 @@ var WindowManager = class { this._clearAnimationInfo(actor); }); + this._resizePending.add(actor); actor.__animationInfo = { clone: actorClone, oldRect: oldFrameRect, destroyId: destroyId }; @@ -1482,6 +1484,7 @@ var WindowManager = class { let scaleX = targetRect.width / sourceRect.width; let scaleY = targetRect.height / sourceRect.height; + this._resizePending.delete(actor); this._resizing.add(actor); // Now scale and fade out the clone @@ -1538,6 +1541,9 @@ var WindowManager = class { actor.translation_y = 0; this._clearAnimationInfo(actor); } + + if (this._resizePending.delete(actor)) + this._shellwm.completed_size_change(actor); } _hasAttachedDialogs(window, ignoreWindow) {